/*12. Desarrollar una clase llamada Conversor, que posea dos métodos de clase (static) que: 
•  Convierta un número de decimal a binario. 
•  Convierta un número binario a decimal. 
Nota: El número debe ser pasado como parámetro.

12 (bis). Tomando la clase Conversor del ejercicio anterior, se pide:

•  Agregar las clases: 
NumeroBinario: 
•	único atributo número (string)
•	único constructor (recibe un parámetro de tipo string)
 NumeroDecimal
•	único atributo número (double)
•	único constructor (recibe un parámetro de tipo double)

•  Agregar sobrecarga de operadores:

       Clase NumeroBinario
1.	string + (NumeroBinario, NumeroDecimal)	(*)
2.	string - (NumeroBinario, NumeroDecimal) 	(*)
3.	bool == (NumeroBinario, NumeroDecimal) 	
4.	bool != (NumeroBinario, NumeroDecimal) 	

       Clase NumeroDecimal
1.	double + (NumeroDecimal, NumeroBinario) 	(*)
2.	double - (NumeroDecimal, NumeroBinario) 	(*)
3.	bool == (NumeroDecimal, NumeroBinario)
4.	bool != (NumeroDecimal, NumeroBinario)

(*): Utilizar los métodos de la clase Conversor. 

•  Agregar las instrucciones necesarias en el ‘Main()’ para:
1.	Instanciar la clase NumeroBinario (con el valor “	 ”)
2.	Instanciar la clase NumeroDecimal (con el valor 9)

•  Operar con los números:
1.	String nBinario = objBinario + objDecimal;
2.	Double nDecimal = objDecimal + objBinario;
3.	Mostrar los resultados por consola.
4.	nBinario = objBinario - objDecimal;
5.	nDecimal = objDecimal - objBinario;
6.	Mostrar los resultados por consola.
7.	Comparar ambos números y determinar si son iguales o no.

•  Agregar conversiones implícitas para poder ejecutar las siguientes instrucciones en el ‘Main()’:
     NumeroBinario objBinario = “1001”;
     NumeroDecimal objDecimal = 9;

NOTA: Cambiar el modificador de visibilidad de los constructores, de las clases NumeroBinario y NumeroDecimal, de public a private. 

•  Agregar conversiones explícitas para poder ejecutar las siguientes instrucciones en el ‘Main()’:
     Console.WriteLine(“El valor en Binario es {0}”, (string)objBinario);
     Console.WriteLine(“El valor en Decimal es {0}”, (double)objDecimal);

*/
/*----------------- Program.cs ----------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SC = System.Console;

namespace Ejercicio_12Bis
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "Ejercicio N12 Bis";
            // Declaracion de variables
            NumeroBinario nbinario = new NumeroBinario("1001");
            NumeroDecimal ndecimal = new NumeroDecimal(9);

            /*------------ Suma ----------------*/
            // Calculos
            string sumabinaria = nbinario + ndecimal;
            double sumadecimal = ndecimal + nbinario;

            // Salida por pantalla
            SC.WriteLine("Suma binaria con decimal: " + sumabinaria +
                        "\nSuma decimal con binaria : " + sumadecimal);

            /*------------ Resta ----------------*/
            // Calculos
            sumabinaria = nbinario - ndecimal;
            sumadecimal = ndecimal - nbinario;

            // Salida por pantalla
            SC.WriteLine("Resta binaria con decimal: " + sumabinaria +
                        "\nResta decimal con binaria : " + sumadecimal);

            /*-------------- Comparacion -------------*/
            if (nbinario == ndecimal)
                SC.WriteLine("Los numeros son iguales");
            else
                SC.WriteLine("Los numeros son distintos");
            SC.ReadLine();
        }
    }
}

/*----------------- NumeroBinario.cs ----------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejercicio_12Bis
{
    class NumeroBinario
    {
        // Atributos
        public String binario;

        // Constructores
        public NumeroBinario(String parametro) { this.binario = parametro; }

        // Sobrecarga de operadores +
        public static String operator + (NumeroBinario nbinario, NumeroDecimal ndecimal){
            double calculo = (Conversor.ConvertirBinarioADecimal(nbinario.binario))+ndecimal.numeroDecimal;
            String resultado= Conversor.ConvertirDecimalABinario(calculo);
            return resultado;
        }
        // y -
        public static String operator -(NumeroBinario nbinario, NumeroDecimal ndecimal)
        {
            double calculo = (Conversor.ConvertirBinarioADecimal(nbinario.binario)) - ndecimal.numeroDecimal;
            String resultado = Conversor.ConvertirDecimalABinario(calculo);
            return resultado;
        }
        //   ==
        public static bool operator ==(NumeroBinario nbinario, NumeroDecimal ndecimal)
        {
            if (Conversor.ConvertirBinarioADecimal(nbinario.binario) == ndecimal.numeroDecimal)
                return true;
            else
                return false;
        }
        //   !=
        public static bool operator !=(NumeroBinario nbinario, NumeroDecimal ndecimal)
        {
            if (Conversor.ConvertirBinarioADecimal(nbinario.binario) != ndecimal.numeroDecimal)
                return true;
            else
                return false;
        }

    }
}

/*----------------- NumeroDecimal.cs ----------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejercicio_12Bis
{
    class NumeroDecimal
    {
        // Atributos
        public double numeroDecimal;

        // Constructor
        public NumeroDecimal(double parametro) { this.numeroDecimal = parametro; }

        // Sobrecarga de operadores
        //  +
        public static double operator + (NumeroDecimal ndecimal, NumeroBinario nbinario){
            double resultado = (Conversor.ConvertirBinarioADecimal(nbinario.binario) + ndecimal.numeroDecimal);
            return resultado;
        }
        //  -
        public static double operator - (NumeroDecimal ndecimal, NumeroBinario nbinario){
            double resultado = (Conversor.ConvertirBinarioADecimal(nbinario.binario) - ndecimal.numeroDecimal);
            return resultado;
        }
        //   ==
        public static bool operator ==(NumeroDecimal ndecimal, NumeroBinario nbinario){
            if (Conversor.ConvertirBinarioADecimal(nbinario.binario) == ndecimal.numeroDecimal)
                return true;
            else
                return false;
        }
        //  !=
        public static bool operator !=(NumeroDecimal ndecimal, NumeroBinario nbinario){
            if (Conversor.ConvertirBinarioADecimal(nbinario.binario) != ndecimal.numeroDecimal)
                return true;
            else
                return false;
        }
    }
}

/*----------------- Conversor.cs ----------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ejercicio_12Bis
{
    class Conversor
    {
        public static string ConvertirDecimalABinario(double numero)
        {
            string resultado = "";
            int division;

            while (numero / 2 != 1)
            {
                resultado = (numero % 2) + resultado;
                division = (int)numero / 2;
                numero = division;
                if (numero == 0)
                    break;
                else if (numero == 2)
                    resultado = "10" + resultado;
            }
            return resultado;
        }
        public static double ConvertirBinarioADecimal(string binar)
        {
            string binario;
            char[] arraybin = null;
            int i = 0;
            double acum = 0;
            int arraych = 0;
            string num;
            binario = binar.Substring(0, binar.Length);
            arraybin = binario.ToCharArray(0, binario.Length);
            for (i = arraybin.Length; i > 0; i--)
            {
                arraych = 0;
                num = arraybin[i - 1].ToString();
                arraych = int.Parse(num);
                acum = acum + (arraych * Math.Pow(2, arraybin.Length - i));
            }
            return acum;
        }
    }
}
